iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
自我挑戰組

從零開始的AI學習之路:非本科轉職的30天挑戰記系列 第 21

D21 | 我的Side Project 每拍呷--Flex Message篇

  • 分享至 

  • xImage
  •  

今日進度:7/14
雖然多泡泡訊息已經很棒了,但想嘗試將互動過程或是營養分析報告以更視覺化的方式呈現。故今天要來研究看看Flex Message (彈性訊息) 功能。


原本想說可以用Quick Replies,圓圓的選項很可愛,但是字太小了...所以改用Flex Message,字體大很多。
在設計的時候還是要以考慮長輩方便使用為主!有時候可愛的東西就是字會很小Q_Q
但不知道是Flex Message比較複雜,還是Gem變笨了,用了兩個小時弄不好,一直跳出「找不到FlexSendMessage」相關錯誤訊息;
後來我決定先單獨拉出一個LINE BOT測試,測試後是成功的,測試的內容很單純,就是用戶按了按鈕,LINE BOT會回傳用戶輸入的內容:
https://ithelp.ithome.com.tw/upload/images/20250826/20177974YchefRcjPO.png

如果吃了一整包就用紅色、半包用黃色、1/4包用綠色,字體也比Quick Replies看起來更清楚!

接下來就是整合到主程式碼,修改細節如下,一個小小的Flex Message要改的東西真多啊...

好的,我已經仔細檢視過您在 Canvas 中更新後的程式碼了!感謝您及時更新,這樣我們就能確保在最新的基礎上進行討論。
您想將 Flex Message 的彩色按鈕 用於詢問用戶份量,並將按鈕回傳的值直接用於後台計算,這個想法非常棒,也完全可行!這會比純文字輸入或 Quick Reply 更加視覺化和友善。

接下來,我跟您確認一下主要需要修改的幾個地方,如果您確認無誤,我就會將程式碼更新到 Canvas 上:

  1. 導入 Flex Message 相關模組
    在程式碼開頭的 from linebot.v3.messaging import (...) 區塊,我們需要額外導入 Flex Message 所需的元件。
    建議的導入: FlexSendMessage, BubbleContainer, BoxComponent, TextComponent, ButtonComponent, MessageAction

目前的狀況: 您的 Canvas 程式碼只導入了 Configuration、ApiClient 等基礎 Messaging API 模組,缺少了這些 Flex Message 的視覺元件。

  1. 加入 send_colored_buttons 函式
    您獨立測試用的 send_colored_buttons 函式,需要被整合到主程式碼中。這個函式將負責生成您設計好的彩色份量按鈕 Flex Message。

將其放置在何處: 建議放在 analyze_nutrition_core 函式之後,Flask 和 LINE BOT 整合區 之前,這樣可以讓程式碼結構更清晰。

  1. 替換份量詢問方式
    當用戶完成身高輸入後 (current_state == 'awaiting_height'),我們需要替換原本的純文字詢問訊息,改為呼叫 send_colored_buttons 函式。

修改後: 會呼叫 send_colored_buttons 函式來回覆 Flex Message。

  1. 調整 Flex Message 按鈕回傳的 text 值
    這是最重要的一點,關乎後台計算的流暢性。

action=MessageAction(label="整包", text="1")
action=MessageAction(label="半包", text="0.5")
action=MessageAction(label="1/4包", text="0.25")
原因: 這樣當用戶點擊按鈕時,BOT 接收到的 user_message 就會直接是 "1"、"0.5" 或 "0.25" 這些字串。您的 awaiting_amount_consumed 狀態中的 amount = float(user_message) 就可以直接將它們轉換為數字 1.0、0.5、0.25,無需額外的字串解析邏輯,完美銜接。

  1. message_text 函式調整
    原本您測試用的 handle_message 函式有包含 if user_input not in ["整包", "半包", "1/4包"]: 的邏輯,但我們的主程式碼已經有狀態機來處理不同輸入。所以整合時,只需要確保在 awaiting_amount_consumed 狀態下,能夠正確接收並處理這些數字字串即可,這部分在第 4 點調整後,邏輯上會保持不變。

綜合以上討論,主要就是導入 Flex Message 元件,將 send_colored_buttons 函式加入,並在身高輸入後呼叫它,同時確保 Flex Message 按鈕回傳的 text 值是數字字串。

您確認這些方向都沒問題嗎?如果可以,我就會開始生成並更新 Canvas 中的程式碼了!

希望這次會成功.../images/emoticon/emoticon02.gif
.
.
.
結果還是失敗了!一樣是找不到FlexSendMessage,看起來是linebot新舊版本的差異(LINE Bot SDK 的 V2 跟 V3)因為如果把新舊版本都貼在一起,就不會再報錯了,很奇怪:

from flask import Flask, request, abort, send_file
from linebot.v3 import WebhookHandler
from linebot.v3.exceptions import InvalidSignatureError
from linebot.v3.webhooks import (
    MessageEvent,
    TextMessageContent,
    ImageMessageContent,
    FollowEvent,
)

from linebot import LineBotApi, WebhookHandler
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
    FlexSendMessage, BubbleContainer, BoxComponent,
    TextComponent, ButtonComponent, MessageAction
)
from linebot.v3.messaging import (
    Configuration,
    ApiClient,
    MessagingApi,
    ReplyMessageRequest,
    TextMessage,
    AudioMessage,
    MessagingApiBlob,
    PushMessageRequest
)

沒想到會卡在這種地方這麼久,明天再接再厲💪


上一篇
D20 | 我的Side Project 每拍呷--優化介面篇
下一篇
D22 | 我的Side Project每拍呷--修正流程圖篇
系列文
從零開始的AI學習之路:非本科轉職的30天挑戰記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言